﻿package igz.fleaxy.configuration
{
	import flash.events.IOErrorEvent;
	import flash.external.ExternalInterface;
	import flash.system.Capabilities;
	import flash.system.Security;
	import igz.fleaxy.debug.Console;
	import igz.fleaxy.events.CommEvent;
	import igz.fleaxy.Fleaxy;
	import igz.fleaxy.net.Comm;
	import igz.fleaxy.net.CommResponseType;
	import igz.fleaxy.util.Convert;
	
	/**
	 * @author Intelygenz | www.intelygenz.com
	 */
	public class ConfigurationManager {
		
		/**
		 * Fichero XML con los datos de la configuración
		 */
		
		private var _ConfigXml:XML;
		public function get $ConfigXml():XML {
			return _ConfigXml;
		}

		private var _SwfUri:String;
		public function get $SwfUri():String { return _SwfUri; }

		private var _SwfPath:String;
		public function get $SwfPath():String { return _SwfPath; }

		private var _SwfFileName:String;
		public function get $SwfFileName():String { return _SwfFileName; }

		private var _Navigator:Boolean = false;
		public function get $Navigator():Boolean { return _Navigator; }

		private var _OperativeSystem:String;
		public function get $OperativeSystem():String { return _OperativeSystem; }

		private var _JsComm:Boolean = false;
		public function get $JsComm():Boolean { return _JsComm; }

		private var _Air:Boolean = false;
		public function get $Air():Boolean { return _Air; }

		private var _DebugMode:Boolean;
		public function get $DebugMode():Boolean { return _DebugMode; }

		private var _Environment:String;
		public function get $Environment():String { return _Environment; }

		private var _Version:String;
		public function get $Version():String { return _Version; }

		private var _WebUri:String;
		public function get $WebUri():String { return _WebUri; }

		private var _DefaultCssUri:String;
		public function get $DefaultCssUri():String { return _DefaultCssUri; }

		private var _DefaultCssName:String;
		public function get $DefaultCssName():String { return _DefaultCssName; }

		private var _DefaultIso639:String;
		public function get $DefaultIso639():String { return _DefaultIso639; }

		private var _DefaultIso639Uri:String;
		public function get $DefaultIso639Uri():String { return _DefaultIso639Uri; }
		
		private var _WidgetUpdateUri:String;
		public function get $WidgetUpdateUri():String { return _WidgetUpdateUri; }
		
		/**
		 * Indica si el entorno en el que se encuentra es Desarrollo
		 */
		public function get $IsDev () : Boolean {
			return _Environment == "DEV";
		}
		
		/**
		 * Indica si el entorno en el que se encuentra es Intregado
		 */
		public function get $IsInt () : Boolean {
			return _Environment == "INT";
		}
		
		/**
		 * Indica si el entorno en el que se encuentra es Producción
		 */
		public function get $IsPro () : Boolean {
			return _Environment == "PRO";
		}

		private var _OnComplete:Function;

		
		/**
		 * Función encargada de rellenar los campos de la configuración a partir de un XML
		 *
		 * @param	p_configXml XML con la configuración
		 */
		public function ConfigurationManager(p_configXml:XML) {
			_ConfigXml = p_configXml;

			if ( Capabilities.playerType != PlayerType.$STAND_ALONE ) {
				_Navigator = true;
			}
			_JsComm = ExternalInterface.available;
			_OperativeSystem = Capabilities.os;
			_Version = Capabilities.version;
			_Air = Security.sandboxType.toString() == "application" ? true : false;

			_SwfUri    = Fleaxy.$Current.$Stage.loaderInfo.url;
			_SwfPath   = "";
			if ( _SwfUri != "" ) {
				_SwfUri = unescape(_SwfUri);
				_SwfFileName = _SwfUri.substring(_SwfUri.lastIndexOf("/")+1);
				_SwfFileName = _SwfFileName.substring(0, _SwfFileName.indexOf(".swf")+4);
				_SwfPath 	 = _SwfUri.substring(0, _SwfUri.lastIndexOf("/"))+"/";
			}

 //Console.$PrintLine("[ConfigurationManager]\n_SwfUri[" + _SwfUri + "]\n_SwfPath[" + _SwfPath + "]");

			_DebugMode = Convert.$ToBoolean(_ConfigXml.SYSTEM.ENVIRONMENT.DEBUG.@value);

			_WebUri 	 = "";
			_Environment = _ConfigXml.SYSTEM.ENVIRONMENT.DEFAULT.@value;
//Console.$PrintLine("0 _Environment->"+_Environment)
			if ( _Navigator && _JsComm ) {

				try {
					_WebUri = ExternalInterface.call("window.location.href.toString");
				}
				catch (p_securityError:SecurityError) {
					
				}
//Console.$PrintLine("1 _Environment->"+_Environment+"__WebUri_"+_WebUri)
				if ( _WebUri!=null && _WebUri != "" ) {//&& _WebUri.lastIndexOf("/") != _WebUri.length-1 ) {
					//_WebUri = _WebUri.substring(0, _WebUri.lastIndexOf("/") + 1);
					
					var environmentXML:XML;
					var environmentText:String;
					for each ( environmentXML in _ConfigXml.SYSTEM.ENVIRONMENT.elements() ) {
						environmentText = String( environmentXML.@uri );
//Console.$PrintLine("2 environmentText->"+environmentText+"__WebUri_"+_WebUri)
						if ( environmentText != "" && _WebUri.indexOf( environmentText ) == 0 ) {
							_Environment = environmentXML.name().toString();
//Console.$PrintLine("3 _Environment->"+_Environment)
							break;
						}
					}
				}
			}
			else if ( !_Air ) {
				// Si no estamos en un navegador con javascript (como cuando debugeamos con FlashDevelop)
				// y no es una aplicación air, establecemos el entorno a desarrollo
				_Environment = "DEV";
			}			
//Console.$PrintLine("[ConfigurationManager]\n_Environment[" + _Environment + "] _WebUri["+_WebUri+"]");

			_DefaultCssName = _ConfigXml.SYSTEM.CSS.DEFAULT.@value;
			_DefaultCssUri  = _ConfigXml.SYSTEM.CSS.FILE.((attribute("name") == _DefaultCssName) || (attribute("name") == null)).attribute( _Environment.toLowerCase() );

			_DefaultIso639 	  = _ConfigXml.SYSTEM.LOCALE.DEFAULT.@iso639;
			_DefaultIso639Uri = _ConfigXml.SYSTEM.LOCALE.FILE.(attribute("name") == _DefaultIso639).attribute( _Environment.toLowerCase() );
			
			_WidgetUpdateUri = $GetValue("SYSTEM/WIDGET_UPDATE/URI");

		}
		
		/**
		 * Devuelve el valor del atributo del nodo indicado
		 * @param	p_xPath Ruta del nodo deseado
		 * @param	p_attributeName Nombre del atributo, si no se especifica
		 * 							coge dev, int o pro, dependiendo del entorno en el que nos encontremos
		 * @return Devuelve el valor del atributo
		 *
		 * @example
		 *
		 * _UriBase = Fleaxy.$Current.$ConfigurationManager.$GetValue("KU03/URI/URI_BASE");
		 *
		 */
		public function $GetValue(p_xPath:String, p_attributeName:String = null) : String {
			if ( p_attributeName==null ) {
				p_attributeName = _Environment.toLowerCase();
			}
			var nodes:Array = p_xPath.split("/");
			var nodeC:uint = 0;
			var xmlList:XMLList = _ConfigXml[ nodes[nodeC++] ];
			while ( xmlList!=null && nodeC<nodes.length ){
				xmlList = xmlList[ nodes[nodeC++] ];
			}
			return xmlList!=null ? xmlList.attribute(p_attributeName) : null;
		}

	}
	
}